相关性分析:Pearson、Kendall、Spearman – 标点符

您所在的位置:网站首页 python 求相关系数 相关性分析:Pearson、Kendall、Spearman – 标点符

相关性分析:Pearson、Kendall、Spearman – 标点符

#相关性分析:Pearson、Kendall、Spearman – 标点符| 来源: 网络整理| 查看: 265

数据, 术→技巧, 机器学习, 法→原理

相关性分析:Pearson、Kendall、Spearman 钱魏Way · 2020-09-15 · 2,876 次浏览

在分析特征间相关性时,常使用的方法是pandas.DataFrame.corr:

DataFrame.corr(self, method=’pearson’, min_periods=1)

其中包含的方法主要为:

pearson:Pearson相关系数 kendall:Kendall秩相关系数 Spearman:Spearman等级相关系数

目录

Pearson相关系数

在统计学中,皮尔逊相关系数相关系数(英语:Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 用r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。-1表示完全的负相关(这个变量下降,那个就会上升),+1表示完全的正相关,0表示没有线性相关。通常情况下通过以下相关系数取值范围判断变量的相关强度:

0.8-1.0 极强相关 0.6-0.8 强相关 0.4-0.6 中等程度相关 0.2-0.4 弱相关 0.0-0.2 极弱相关或无相关

该相关系数是判断两组数据与某一直线拟合程度的一种度量,对应的公式比欧几里得距离计算公式要复杂,但是他在数据不是很规范(normalized)的时候,会倾向于给出更好的结果。

皮尔逊相关系数的定义

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:

$$\rho_{X,Y}=\frac{cov(X,Y)}{\sigma _X \sigma _Y} = \frac{E[(X-\mu _X)(Y-\mu _Y)]}{\sigma _X \sigma _Y}$$

协方差是一个反映两个随机变量相关程度的指标,如果一个变量跟随着另一个变量同时变大或者变小,那么这两个变量的协方差就是正值,反之相反。虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但是协方差值的大小并不能很好地度量两个随机变量的关联程度,其值大小与两个变量的量纲有关,不适于比较。为了更好的度量两个随机变量的相关程度, Pearson相关系数其在协方差的基础上除以了两个随机变量的标准差。相关系数ρ相当于协方差的“标准化”,消除了量纲的影响。

上式定义了总体相关系数,常用希腊小写字母 ρ (rho) 作为代表符号。估算样本的协方差和标准差,可得到样本相关系数(样本皮尔逊系数),常用英文小写字母 r 代表:

$$r = \frac{\sum_{i=1}^{n}{(X_i-\overline X)(Y_i-\overline Y)}}{\sqrt{\sum_{i=1}^{n}{(X_i-\overline X)^2}}\sqrt{\sum_{i=1}^{n}{(Y_i-\overline Y)^2}}}$$

r 亦可由(Xi,Yi)样本点的标准分数均值估计,得到与上式等价的表达式:

$$r = \frac{1}{n-1}\sum_{i=1}^{n}(\frac{X_i-\overline X}{\sigma _X})(\frac{Y_i-\overline Y}{\sigma _Y})$$

其中 $frac {X_{i}-{\overline {X}}}{\sigma _{X}}$、 $\overline {X}$及$\sigma _{X}$分别是对$X_{i}$样本的标准分数、样本平均值和样本标准差。

皮尔逊相关系数的数学特性

皮尔逊相关系数有一个重要的数学特性是,因两个变量的位置和尺度的变化并不会引起该系数的改变,即它该变化的不变量 (由符号确定)。也就是说,我们如果把X移动到a + bX和把Y移动到c + dY,其中a、b、c和d是常数,并不会改变两个变量的相关系数(该结论在总体和样本皮尔逊相关系数中都成立)。

由于μX = E(X), σX2 = E[(X − E(X))2] = E(X2) − E2(X),Y也类似, 并且

$$E[(X-E(X))(Y-E(Y))]=E(XY)-E(X)E(Y)$$

故相关系数也可以表示成:

$$\rho _{X,Y}={\frac {E(XY)-E(X)E(Y)}{{\sqrt {E(X^{2})-(E(X))^{2}}}~{\sqrt {E(Y^{2})-(E(Y))^{2}}}}}$$

对于样本皮尔逊相关系数:

$$r_{xy}={\frac {\sum x_{i}y_{i}-n{\bar {x}}{\bar {y}}}{(n-1)s_{x}s_{y}}}={\frac {n\sum x_{i}y_{i}-\sum x_{i}\sum y_{i}}{{\sqrt {n\sum x_{i}^{2}-(\sum x_{i})^{2}}}~{\sqrt {n\sum y_{i}^{2}-(\sum y_{i})^{2}}}}} = \frac{\sum x_iy_i-\frac{\sum x_i\sum y_i}{n}}{\sqrt{(\sum x_i^2-\frac{(\sum x_i)^2}{n})(\sum y_i^2-\frac{(\sum y_i)^2}{n})}}$$

皮尔逊相关系数的适用范围

当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

两个变量之间是线性关系,都是连续数据。 两个变量的总体是正态分布,或接近正态的单峰分布。 两个变量的观测值是成对的,每对观测值之间相互独立。 皮尔逊相关系数的Python实现 def pearson(x, y): n = len(x) vals = range(n) # 简单求和 sumx = sum([x[i] for i in vals]) sumy = sum([y[i] for i in vals]) # 求平方和 sumxSq = sum([x[i] ** 2 for i in vals]) sumySq = sum([y[i] ** 2 for i in vals]) # 求乘积之和 pSum = sum([x[i] * y[i] for i in vals]) # 计算皮尔逊评价值 num = pSum-(sumx*sumy/n) den = ((sumxSq-sumx**2/n)*(sumySq-sumy**2/n)) ** 0.5 if den == 0: r = 1 else: r = num/den return r 皮尔逊距离

皮尔逊距离度量的是两个变量X和Y,它可以根据皮尔逊系数定义成

$$d_{X,Y}=1-\rho _{X,Y}$$

我们可以发现,皮尔逊系数落在 [-1, 1],而皮尔逊距离落在 [0,2]。

皮尔逊相关系数与余弦相似度和欧氏距离的关系

在数据标准化(μ= 0, σ=1)后,Pearson相关性系数、Cosine相似度、欧氏距离的平方可认为是等价的。换句话说,如果你的数据符合正态分布或者经过了标准化处理,那么这三种度量方法输出等价,不必纠结使用哪一种。

标准化(Standardization)是一种常见的数据缩放手段,标准化后的数据均值为0,标准差为1。公式:

$$z(X)=\frac{X_i-\mu _X}{\sigma _X}$$

代码演示:

import numpy as np from scipy.stats import pearsonr from scipy.spatial.distance import euclidean from scipy.spatial.distance import cosine from sklearn.preprocessing import StandardScaler # 设定向量长度,均为100 n = 100 x1 = np.random.random_integers(0, 10, (n, 1)) x2 = np.random.random_integers(0, 10, (n, 1)) x3 = np.random.random_integers(0, 10, (n, 1)) p12 = 1 - pearsonr(x1, x2)[0][0] p13 = 1 - pearsonr(x1, x3)[0][0] p23 = 1 - pearsonr(x2, x3)[0][0] d12 = (euclidean(x1, x2) ** 2) / (2 * n) d13 = (euclidean(x1, x3) ** 2) / (2 * n) d23 = (euclidean(x2, x3) ** 2) / (2 * n) c12 = cosine(x1, x2) c13 = cosine(x1, x3) c23 = cosine(x2, x3) print('原始数据,没有标准化') print(' x1&x2 x2&x3 x1&x3') print('pearson: ', np.round(p12, decimals=4), np.round(p13, decimals=4), np.round(p23, decimals=4)) print('cos: ', np.round(c12, decimals=4), np.round(c13, decimals=4), np.round(c23, decimals=4)) print('euclidean sq', np.round(d12, decimals=4), np.round(d13, decimals=4), np.round(d23, decimals=4)) # 标准化后的数据 x1_n = StandardScaler().fit_transform(x1) x2_n = StandardScaler().fit_transform(x2) x3_n = StandardScaler().fit_transform(x3) p12_n = 1 - pearsonr(x1_n, x2_n)[0][0] p13_n = 1 - pearsonr(x1_n, x3_n)[0][0] p23_n = 1 - pearsonr(x2_n, x3_n)[0][0] d12_n = (euclidean(x1_n, x2_n) ** 2) / (2 * n) d13_n = (euclidean(x1_n, x3_n) ** 2) / (2 * n) d23_n = (euclidean(x2_n, x3_n) ** 2) / (2 * n) c12_n = cosine(x1_n, x2_n) c13_n = cosine(x1_n, x3_n) c23_n = cosine(x2_n, x3_n) print('标准化后的数据: 均值=0,标准差=1') print(' x1&x2 x2&x3 x1&x3') print('pearson: ', np.round(p12_n, decimals=4), np.round(p13_n, decimals=4), np.round(p23_n, decimals=4)) print('cos: ', np.round(c12_n, decimals=4), np.round(c13_n, decimals=4), np.round(c23_n, decimals=4)) print('euclidean sq', np.round(d12_n, decimals=4), np.round(d13_n, decimals=4), np.round(d23_n, decimals=4))

我们一般用欧氏距离(向量间的距离)来衡量向量的相似度,但欧氏距离无法考虑不同变量间取值的差异。举个例子,变量a取值范围是0至1,而变量b的取值范围是0至10000,计算欧式距离时变量b上微小的差异就会决定运算结果。而Pearson相关性系数可以看出是升级版的欧氏距离平方,因为它提供了对于变量取值范围不同的处理步骤。因此对不同变量间的取值范围没有要求(unit free),最后得到的相关性所衡量的是趋势,而不同变量量纲上差别在计算过程中去掉了,等价于z-score标准化。而未经升级的欧氏距离以及cosine相似度,对变量的取值范围是敏感的,在使用前需要进行适当的处理。例如,在低维度可以优先使用标准化后的欧式距离或者其他距离度量,在高维度时Pearson相关系数更加适合。不过说到底,这几个衡量标准差别不大,很多时候的输出结果是非常相似的。

Scipy的pearsonr方法

Scipy的pearsonr方法能够同时计算相关系数和p-value。

import numpy as np from scipy.stats import pearsonr np.random.seed(0) size = 300 x = np.random.normal(0, 1, size) print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))) print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size))) # output: # Lower noise (0.7182483686213842, 7.324017312997672e-49) # Higher noise (0.05796429207933815, 0.31700993885325246)

这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。

Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。

import numpy as np from scipy.stats import pearsonr x = np.random.uniform(-1, 1, 100000) print(pearsonr(x, x ** 2)) # output: # (0.0020775478403054566, 0.511199686284783)

参考链接:

皮尔逊相关系数 如何理解皮尔逊相关系数(Pearson Correlation Coefficient) Kendall秩相关系数

在统计学中,肯德尔相关系数是以Maurice Kendall命名的,并经常用希腊字母τ(tau)表示其值。肯德尔相关系数是一个用来测量两个随机变量相关性的统计值。一个肯德尔检验是一个无参数假设检验,它使用计算而得的相关系数去检验两个随机变量的统计依赖性。肯德尔相关系数的取值范围在-1到1之间,当τ为1时,表示两个随机变量拥有一致的等级相关性;当τ为-1时,表示两个随机变量拥有完全相反的等级相关性;当τ为0时,表示两个随机变量是相互独立的。

假设两个随机变量分别为X、Y(也可以看做两个集合),它们的元素个数均为N,两个随机变量取的第i(1



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3